//
//  ViewController.m
//  27-Block
//
//  Created by 王道林 on 16/8/19.
//  Copyright © 2016年 王道林. All rights reserved.
//

#import "ViewController.h"
#import "NextViewController.h"
@interface ViewController ()
// Block  在属性中得写法
@property (nonatomic, copy) void (^wangBlock)();
@property (retain, nonatomic) IBOutlet UILabel *textLabel;


// block在方法中得写法

- (void)handleData:(void (^)(void))block;


@end

@implementation ViewController

- (void)handleData:(void (^)(void))block
{
    [[NSURLSession sharedSession] dataTaskWithRequest:[NSURLRequest new] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        block();
    }];
}






- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //  1.   block  是啥?  消息传递机制 之一
    // Block 与 函数相似,有固定功能的代码段
    // 2.  block基本语法
    // block 的声明
    // 类型 void (^)(void)  变量名block
    void (^block)(void);
    
    // block的赋值..
    //  block变量 = ^(参数列表) { 固定的代码段 }
    block = ^(void)
    {
    };
    
    //  3.block的几种形式
    //  有参有返回
    int (^sum)(int, int) = ^(int a, int b){
        return a + b;
    };
    //  you参wu返回
    void(^printNumber)(int number) = ^(int number){
        NSLog(@"%d", number);
    };
    //  无参有返回
    NSString *(^returnString)() = ^{
        return @"heihei";
    };
    //  无参无返回 最简写法
    void(^block2)() = ^{
        self.view.backgroundColor = [UIColor redColor];
    };
    

    
    // 系统提供了代码段可以直接使用, inlineBlock
//    <#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
//        <#statements#>
//    };
    
    
    // 4. block 的调用
    sum(1, 2);
    
    
    // 系统中的block
    // 1 .  模态
//    [self presentViewController:<#(nonnull UIViewController *)#> animated:<#(BOOL)#> completion:<#^(void)completion#>];
    
    // 2 . GCD
//    dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
    
    // 3 . 系统的网络请求
    
//    [NSURLSession sharedSession] dataTaskWithRequest:<#(nonnull NSURLRequest *)#> completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    
//}
//    
    
    
//   带block 的方法 调用
    [self handleData:^{
        
    }];
    
    // 属性Block修饰符, 使用copy
    self.wangBlock = block;
    self.wangBlock();
    
    
    // 7. 类型的修饰符
    // __block    __weak   __strong
    
    // 1>  __block  在ARC 和MRC 下有区别
    // ARC和MRC下都可以
    // 可以在block内部修改外部变量
    
    // ARC下不能避免循环引用的问题
    // MRC 下可以
    int __block a = 0;
    void (^blockTest)() = ^{
        a = 100;
    };
    
    
    // 2> __weak(弱引用) 修饰Block外部的变量
    //  只能在ARC下使用, 避免Block的循环引用
    
    
    // 3> __strong 强引用
    
}



- (IBAction)nextPage:(id)sender {
    
    NextViewController *nextVC = [[NextViewController alloc] init];
    
    // Block会对其内部的所有对象进行强引用
    NextViewController * __block WeakVC = nextVC;
    nextVC.paseTitle = ^(NSString *title) {
//   nextVC 对Block属性持有, 所以相互持有,产生循环引用
 //       nextVC.view.backgroundColor = [UIColor redColor];
        WeakVC.view.backgroundColor = [UIColor redColor];
        self.textLabel.text = title;
    };
    
    [self.navigationController pushViewController:nextVC animated:YES];
    
}







- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
